//using System.Reflection;
//using Mbs.ComponentModel.Container.Context;
//using Mbs.Reflection;

//namespace Mbs.ComponentModel.Container.Injection
//{
//    public class CounstructorInject : IInject<ConstructorInfo>
//    {
//        private IKernel Kernel;
//        public IInjectContext InjectContext { get; private set; }

//        public void Execute(IInjectContext<ConstructorInfo> ctx)
//        {
//            if (ctx == null
//               || ctx.Kernel == null)
//                return;

//            Kernel = ctx.Kernel;
//            InjectContext = ctx;

//            DoExecute(ctx);
//        }

//        void ICommand<IInjectContext>.Execute(IInjectContext ctx)
//        {
//            Execute(ctx as IInjectContext<ConstructorInfo>);
//        }

//        protected virtual void DoExecute(IInjectContext<ConstructorInfo> ctx)
//        {
//            foreach (var pair in ctx.Members)
//                OnInvoke(pair.Key, GetParameters(pair.Key.GetParameters()));
//        }

//        protected virtual void OnInvoke(ConstructorInfo method,object[] args)
//        {
//            (InjectContext as InjectContext<ConstructorInfo>).Instance = method.GetFactoryMethod()(args);
//        }

//        protected virtual object[] GetParameters(ParameterInfo[] ps)
//        {
//            int length = ps.Length;
//            object[] result = new object[length];
//            foreach (var p in ps)
//            {
//                var att = p.GetAttribute<InjectAttribute>(false);
//                if (att == null
//                    || string.IsNullOrEmpty(att.Id)
//                    || !Kernel.HasRegister(att.Id))
//                    result[p.Position] = Kernel.Get(p.ParameterType);
//                else
//                    result[p.Position] = Kernel.Get(att.Id);
//            }
//            return result;
//        }

//    }
//}
